﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Input;
using System.Windows;
using CapaPresentacion.Commands;
using Entidades;
using CapaLogica;
using CapaPresentacion.Vistas;
using Microsoft.Win32;
using System.Windows.Media.Imaging;
using System.Transactions;
using System.Collections.ObjectModel;
using System.Globalization;

namespace CapaPresentacion.Controles
{    
    class EvaluarAlumno1añoViewModel
    {

        #region Variables de clase        

        public event ReiniciarCU ReiniciarCU;

        private RelayCommand saveCommand;
        private RelayCommand newCommand;
        private RelayCommand openCommand;

        private EvaluacionAlumno evaluacionAlumno;
        private EvaluacionAlumno evaluacionAlumnoSinModificaciones;

        private Guid legajoAlumnoEvaluado;

        private EvaluarAlumno1año view;

        public List<ViewEntity> ListaEtapaGrafica { get; set; }

        public List<ViewEntity> ListaAlumnos{ get; set; }

        #endregion

        #region Propiedades Públicas

        public EvaluacionAlumno EvaluacionAlumno
        {
            get { return evaluacionAlumno; }
            set { evaluacionAlumno = value; }
        }

        public Guid LegajoAlumnoEvaluado
        {
            get { return legajoAlumnoEvaluado; }
            set { legajoAlumnoEvaluado = value; }
        }


        public ICommand SaveCommand
        {
            get
            {
                return saveCommand;
            }
        }

        public ICommand NewCommand
        {
            get
            {
                return newCommand;
            }
        }

        public ICommand OpenCommand
        {
            get
            {
                return openCommand;
            }
        }

        #endregion

        #region Constructores

        public EvaluarAlumno1añoViewModel(EvaluarAlumno1año vista)
        {
            this.view = vista;
            this.saveCommand = new RelayCommand(GuardarEvaluacion);
            this.newCommand = new RelayCommand(NuevaEvaluacion);
            this.openCommand = new RelayCommand(AbrirEvaluacion);
            
            evaluacionAlumno = new EvaluacionAlumno();
            evaluacionAlumno.Evaluacion = new Evaluacion();
            evaluacionAlumno.InscripcionCicloLectivo = new InscripcionCicloLectivo();
            evaluacionAlumno.Evaluacion.IdEvaluacion = Guid.NewGuid();


            // ERROR: Debe obtenerse el id de la Inscripcion correspondiente al ciclo lectivo y alumno
            evaluacionAlumno.InscripcionCicloLectivo.IdInscripcionCicloLectivo = Guid.NewGuid();
            evaluacionAlumno.Evaluacion.TipoEvaluacion = "1, 2 Años";
            evaluacionAlumno.Evaluacion.EsIndependiente = false;
            evaluacionAlumno.Evaluacion.EsDependiente = false;
            evaluacionAlumno.Evaluacion.EsAgresivo = false;
            evaluacionAlumno.Evaluacion.EsActivo = false;
            evaluacionAlumno.Evaluacion.EsPasivo = false;
            evaluacionAlumno.Evaluacion.EsCeloso = false;
            evaluacionAlumno.Evaluacion.EsInquieto = false;
            evaluacionAlumno.Evaluacion.EsSolitario = false;
            evaluacionAlumno.Evaluacion.EsAfectuoso = false;
            evaluacionAlumno.Evaluacion.EsRuidoso = false;
            evaluacionAlumno.Evaluacion.EsSociable = false;
            evaluacionAlumno.Evaluacion.EsColaborador = false;
            evaluacionAlumno.Evaluacion.EsCurioso = false;
            evaluacionAlumno.Evaluacion.EsInestable = false;
            evaluacionAlumno.Evaluacion.EsRebelde = false;
            evaluacionAlumno.Evaluacion.EsTimido = false;
            evaluacionAlumno.Evaluacion.EsRetraido = false;


            ListaEtapaGrafica = new List<ViewEntity>();
            ListaEtapaGrafica.Add(new ViewEntity("Garabato descontrolado"));
            ListaEtapaGrafica.Add(new ViewEntity("Garabato con nombre"));
            ListaEtapaGrafica.Add(new ViewEntity("Garabato controlado"));
            ListaEtapaGrafica.Add(new ViewEntity("Renacuajo"));
            ListaEtapaGrafica.Add(new ViewEntity("Monigote"));
            ListaEtapaGrafica.Add(new ViewEntity("Figura humana con detalles"));
            ListaEtapaGrafica.Add(new ViewEntity("Pre esquemática"));

            ListaAlumnos = new EvaluarAlumnoLogica().ObtenerAlumnosCicloActual();

            this.view.cmbAlumnos.Visibility = Visibility.Visible;
            this.view.spDatosAlumno.Visibility = Visibility.Collapsed;
            
        }


        public EvaluarAlumno1añoViewModel(EvaluarAlumno1año vista, EvaluacionAlumno entidad)
        {
            this.view = vista;
            this.evaluacionAlumno = entidad;
            this.evaluacionAlumnoSinModificaciones = (EvaluacionAlumno)entidad.Clone();
            this.legajoAlumnoEvaluado = this.evaluacionAlumno.InscripcionCicloLectivo.Alumno.LegajoAlumno;

            this.saveCommand = new RelayCommand(GuardarEvaluacion);
            this.newCommand = new RelayCommand(NuevaEvaluacion);
            this.openCommand = new RelayCommand(AbrirEvaluacion);

            ListaEtapaGrafica = new List<ViewEntity>();
            ListaEtapaGrafica.Add(new ViewEntity("Garabato descontrolado"));
            ListaEtapaGrafica.Add(new ViewEntity("Garabato con nombre"));
            ListaEtapaGrafica.Add(new ViewEntity("Garabato controlado"));
            ListaEtapaGrafica.Add(new ViewEntity("Renacuajo"));
            ListaEtapaGrafica.Add(new ViewEntity("Monigote"));
            ListaEtapaGrafica.Add(new ViewEntity("Figura humana con detalles"));
            ListaEtapaGrafica.Add(new ViewEntity("Pre esquemática"));

            this.view.lblAlumno.Content =  this.evaluacionAlumno.InscripcionCicloLectivo.Alumno.ApellidoAlumno + ", " + this.evaluacionAlumno.InscripcionCicloLectivo.Alumno.NombreAlumno + " / DNI: " + this.evaluacionAlumno.InscripcionCicloLectivo.Alumno.DniAlumno;

            this.view.cmbAlumnos.Visibility = Visibility.Collapsed;
            this.view.spDatosAlumno.Visibility = Visibility.Visible;


        }

        #endregion

        #region Métodos

        private void NuevaEvaluacion(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea comenzar una nueva evaluación?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.EvaluarAlumno);
            }
        }

        private void AbrirEvaluacion(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea editar una evaluación existente?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.BuscarEvaluacion);
            }
        }

        private void GuardarEvaluacion(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea guardar los datos?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                
                if (Validaciones())
                {
                    try
                    {                       
                        this.evaluacionAlumno.NombreDocente = CultureInfo.InvariantCulture.TextInfo.ToTitleCase(this.evaluacionAlumno.NombreDocente);

                        if (!new EvaluarAlumnoLogica().ExisteEntidad(this.evaluacionAlumno)) // Nueva Evaluacion
                        {
                            if (this.evaluacionAlumno.FechaEvaluacion.ToShortDateString() == "01/01/0001")
                            {
                                this.evaluacionAlumno.FechaEvaluacion = DateTime.Now;

                            }

                            new EvaluarAlumnoLogica().Agregar(evaluacionAlumno);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "La Evaluación ha sido creada correctamente");
                            nueva.ShowDialog();
                        }
                        else                        // Edición de Evaluacion
                        {

                            new EvaluarAlumnoLogica().Modificar(evaluacionAlumno);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "La Evaluación ha sido modificada correctamente");
                            nueva.ShowDialog();

                        }

                    }
                    catch (Exception)
                    {

                        VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "Ha ocurrido un error y la evaluación no se ha guardado");
                        nueva.ShowDialog();

                    }

                }

            }
        }

        internal bool Validaciones()
        {

            if (String.IsNullOrWhiteSpace(evaluacionAlumno.NombreDocente))
            {
                if (this.evaluacionAlumnoSinModificaciones != null)
                    this.evaluacionAlumno.NombreDocente = this.evaluacionAlumnoSinModificaciones.NombreDocente;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Docente' es obligatorio");
                nueva.ShowDialog();
                return false;
            }

            if (legajoAlumnoEvaluado == null || legajoAlumnoEvaluado == Guid.Empty)
            {

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "Debe seleccionar un alumno a evaluar");
                nueva.ShowDialog();
                return false;
            }

            this.evaluacionAlumno.InscripcionCicloLectivo = new InscripcionAlumnoLogica().ObtenerEntidadMedianteAlumno(legajoAlumnoEvaluado);

            if (this.evaluacionAlumno.FechaEvaluacion.ToShortDateString() != "01/01/0001")
            {

                if (this.evaluacionAlumno.FechaEvaluacion < this.evaluacionAlumno.InscripcionCicloLectivo.Turno.CicloLectivo.FechaDesde)
                {
                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "La fecha de evaluación no puede ser menor a la fecha de inscripción al ciclo lectivo");
                    nueva.ShowDialog();
                    return false;

                }

                if (this.evaluacionAlumno.FechaEvaluacion > this.evaluacionAlumno.InscripcionCicloLectivo.Turno.CicloLectivo.FechaHasta)
                {
                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "La fecha de evaluación no puede ser mayor a la fecha de fin del ciclo lectivo");
                    nueva.ShowDialog();
                    return false;

                }

            }


            return true;
        }

        #endregion








    }
}
